const Koa = require('koa');
const koaBody = require('koa-body'); //上下文解析
const koaStatic = require('koa-static');    //静态资源服务
const parameter = require('koa-parameter'); //验证参数是否符合要求
const path = require('path');
const cors = require('koa2-cors');       //跨域访问组件
const error = require('koa-json-error');
const Token = require('./utils/token')
const koa_jwt = require('koa-jwt')
const {secret} = require('./configs/config');
const app = new Koa();
const routing = require('./routes');
const { logger,accessLogger } = require('./utils/logs.js');
const production = 'production';
require('./models/index');
// require('./utils/schedule'); #定时器
app.use(koaStatic(path.join(__dirname, './public')));
app.use(error({
    postFormat: (e, {stack, ...rest}) => production === 'production' ? rest : {stack, ...rest}
}));
//日志中间件
app.use(accessLogger()); 
//解析token中间件保存数据在start中ctx.state.user获取对象
app.use(async(ctx, next)=> {
    var token = ctx.headers.authorization;
    if(token == undefined){
        await next();
    }else{
        token = Token.decrypt(token)
        if(token["token"]){
            ctx.state = {data:token["data"]}
        }
        await next();
    }
})
//捕获token过期状态
app.use(async(ctx, next)=>{
    return next().catch((err) => {
        if (401 == err.status) {
          ctx.status = 401;
            ctx.body = {
                code:401,
                msg:'Token过期，请重新登录'
            }
        } else {
            throw err;
        }
    });
});
//不需要token验证的路由接口
app.use(koa_jwt({secret: secret}).unless({path: ['/users/login','/geo/add']}));
app.use(koaBody({
    multipart: true,
    formidable: {
        keepExtensions: true,
        maxFieldsSize: 20 * 1024 * 1024, // 设置文件上传大小
    },
}));
app.use(
       cors(
//         {
//             origin: function(ctx) { //设置允许来自指定域名请求
//                 const whiteList = ['http://127.0.0.1:8080']; //可跨域白名单
//                 let url = ctx.header.referer.substr(0,ctx.header.referer.length - 1);
//                 if(whiteList.includes(url)){
//                     return url //注意，这里域名末尾不能带/，否则不成功，所以在之前我把/通过substr干掉了
//                 }
//                 return 'http://127.0.0.1:8080' //默认允许本地请求3000端口可跨域
//             },
//             maxAge: 5, //指定本次预检请求的有效期，单位为秒。
//             credentials: false, //是否允许发送Cookie
//             allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], //设置所允许的HTTP请求方法
//             allowHeaders: ['Content-Type', 'Authorization', 'Accept'], //设置服务器支持的所有头信息字段
//             exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'] //设置获取其他自定义字段
// }
        )
);
app.on('error', err => {
    logger.error(err);
  });
app.use(parameter(app));
routing(app);
app.listen(3000, () => console.log('程序启动在 3000 端口了'));
